#include <iostream>
#include <fcntl.h>      // 文件控制定义
#include <unistd.h>     // UNIX标准函数定义
#include <termios.h>    // POSIX终端控制定义
#include <cstring>      // memset等函数
#include <stdexcept>    // 异常处理
#include <vector>
#include <thread>
#include <atomic>
#include <errno.h>
#include <chrono>
#include <iomanip>
#include <string>
#include <cstdint>
#include <mutex>

struct SerialStatus {
    char flag;    // 状态标志位（0x01：不发送信息；0x11：发送信息）
    bool valid;      // 数据是否有效（帧头帧尾完整）
};

class SerialPort 
{
    private:
        int fd_;                      // 串口文件描述符
        bool keep_running_;           // 控制异步读取线程的标志
        std::thread read_thread_;     // 异步读取线程

        SerialStatus latest_status_;
        mutable std::mutex status_mutex_;
        // 辅助函数：解析状态标志位
        SerialStatus parseStatus(const std::vector<uint8_t>& buffer);
    
    public:
        // 构造函数，打开并配置串口
        SerialPort(const std::string& port, int baudrate = B115200);
        
        // 析构函数，关闭串口
        ~SerialPort();
        
        // 禁止拷贝构造和赋值操作
        SerialPort(const SerialPort&) = delete;
        SerialPort& operator=(const SerialPort&) = delete;
        
        // 发送字节数据
        ssize_t sendBytes(const std::vector<uint8_t>& data);
        
        // 发送字符串数据
        ssize_t sendString(const std::string& str);
        
        // 读取字节数据
        std::vector<uint8_t> readBytes(size_t max_size = 1024);
        
        // 启动异步读取
        void startAsyncRead();
        
        // 停止异步读取
        void stop();

        // 获取最新解析的状态标志位
        SerialStatus getLatestStatus() const {
            std::lock_guard<std::mutex> lock(status_mutex_);
            return latest_status_;
        }
};

/* 相关用法 */

// 示例：发送整数数组
// int intArray[] = {1, 2, 3, 4, 5};
// size_t arraySize = sizeof(intArray) / sizeof(int);

// // 转换为字节向量
// std::vector<uint8_t> data(reinterpret_cast<uint8_t*>(intArray), 
//                          reinterpret_cast<uint8_t*>(intArray) + arraySize * sizeof(int));

// // 发送数据
// serialPort.sendBytes(data);

// 示例：发送字节数组
// uint8_t byteArray[] = {0x01, 0x02, 0x03, 0x04, 0x05};
// size_t arraySize = sizeof(byteArray) / sizeof(uint8_t);

// // 转换为字节向量
// std::vector<uint8_t> data(byteArray, byteArray + arraySize);

// // 发送数据
// serialPort.sendBytes(data);

// 示例：发送浮点数数组
// float floatArray[] = {1.1f, 2.2f, 3.3f, 4.4f, 5.5f};
// size_t arraySize = sizeof(floatArray) / sizeof(float);

// // 转换为字节向量
// std::vector<uint8_t> data(reinterpret_cast<uint8_t*>(floatArray), 
//                          reinterpret_cast<uint8_t*>(floatArray) + arraySize * sizeof(float));

// // 发送数据
// serialPort.sendBytes(data);
